import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import quad

# 中文和负号正常显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

def test_integrability_necessary():
    """
    验证函数有界是可积的必要条件
    """
    print("=" * 60)
    print("验证：函数有界是可积的必要条件")
    print("=" * 60)
    
    # 有界函数示例：f(x) = x²
    def bounded_func(x):
        return x**2
    
    # 无界函数示例：f(x) = 1/√x 在 (0,1] 上
    def unbounded_func(x):
        # 避免除以零，给一个很小的偏移
        x_safe = np.maximum(x, 1e-10)
        return 1 / np.sqrt(x_safe)
    
    # 测试有界函数的可积性
    try:
        result_bounded, error_bounded = quad(bounded_func, 0, 1)
        print(f"有界函数 f(x)=x² 在 [0,1] 上的积分: {result_bounded:.6f}")
        print("✓ 有界函数可积")
    except Exception as e:
        print(f"有界函数积分错误: {e}")
    
    # 测试无界函数的可积性（实际上是广义积分）
    try:
        result_unbounded, error_unbounded = quad(unbounded_func, 0, 1)
        print(f"无界函数 f(x)=1/√x 在 (0,1] 上的广义积分: {result_unbounded:.6f}")
        print("⚠ 注意：这是广义积分，不是普通定积分")
    except Exception as e:
        print(f"无界函数积分错误: {e}")
    
    # 可视化对比
    x = np.linspace(0.01, 1, 1000)
    
    plt.figure(figsize=(12, 4))
    
    plt.subplot(1, 2, 1)
    plt.plot(x, bounded_func(x), 'b-', linewidth=2)
    plt.title(r'有界函数: $f(x) = x^2$在[0,1]上可积')
    plt.xlabel('x')
    plt.ylabel('f(x)')
    plt.grid(True, alpha=0.3)
    
    plt.subplot(1, 2, 2)
    plt.plot(x, unbounded_func(x), 'r-', linewidth=2)
    plt.title(r'无界函数: $f(x) = 1/\sqrt{x}$在(0,1]上需要广义积分')
    plt.xlabel('x')
    plt.ylabel('f(x)')
    plt.grid(True, alpha=0.3)
    
    plt.tight_layout()
    plt.show()

test_integrability_necessary()